package br.ufrj.neg.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;

import br.ufrj.neg.bean.Idioma;
import br.ufrj.neg.constants.General;
import br.ufrj.neg.evento.bean.LogomarcaBean;
import br.ufrj.neg.evento.bean.TipoLogomarcaEnum;
import br.ufrj.neg.evento.model.LogomarcaModel;
import br.ufrj.neg.preparacao.bean.NegociacaoBean;
import br.ufrj.neg.preparacao.bean.NegociacaoContext;
import br.ufrj.neg.preparacao.model.NegociacaoModel;
import br.ufrj.neg.usuario.bean.UsuarioBean;
import br.ufrj.neg.util.Data;

public class CadastrarNegociacaoAction extends VelocityViewServlet{

	private static final long serialVersionUID = -1502095409248120929L;
	//private static Logger log = Logger.getLogger("rootLogger");
	
	private static final String TMP_DIR_PATH ="/imagens/logos/temp";
	private File tmpDir;
	private static final String DESTINATION_DIR_PATH ="/imagens/logos";
	private File destinationDir;
 
	@Override
	public void init() throws ServletException {
		
		super.init();
//		tmpDir = new File(TMP_DIR_PATH);
//		if(!tmpDir.isDirectory()) {
//			throw new ServletException(TMP_DIR_PATH + " is not a directory");
//		}
		String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
		destinationDir = new File(realPath);
		if(!destinationDir.isDirectory()) {
			throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
		}
		realPath = getServletContext().getRealPath(TMP_DIR_PATH);
		tmpDir = new File(realPath);
		if(!tmpDir.isDirectory()) {
			throw new ServletException(TMP_DIR_PATH+" is not a directory");
		}

		
	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		NegociacaoModel nm = new NegociacaoModel();
		Idioma idioma = (Idioma) request.getAttribute("idioma");
		/*
		 * Pega a sessão
		 */
		HttpSession session = request.getSession(false);
					
		/*
		 * Pega os parametros passados
		 */
		String negociacao = null; //= General.getParameterUTF8(request,"nomeNegocio");
		String modeloNegocioId = null;// = General.getParameterUTF8(request,"modeloNegocio");
		String cliente = null;// = General.getParameterUTF8(request,"clienteNegocio");
		String negociador =  null;// = General.getParameterUTF8(request,"negociadorNegocio");
		String idUsuario = null;
		//UsuarioBean usuario = (UsuarioBean) request.getSession().getAttribute("usuarioBean");
		String idUsuarioContraparte = null;// = General.getParameterUTF8(request,"idUsuarioContraparte");
		String caminhoLogoNegociador = null;
		String caminhoLogoCliente = null;
		
		Data dataCadastro;
		try {
			dataCadastro = new Data(General.getParameterUTF8(request,"dataNegocio"));
		} catch (Exception e) {
			dataCadastro = new Data();
		}
		
	    
		DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
		fileItemFactory.setSizeThreshold(1*1024*1024); //1 MB
		//fileItemFactory.setRepository(tmpDir);
		ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
		try {
			List items = uploadHandler.parseRequest(request);
			Iterator itr = items.iterator();
			while(itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				
				if(item.isFormField()) {
						
					//System.out.println(item.getFieldName());
					//System.out.println(item.getString());
					
					if(item.getFieldName().equals("nomeNegocio")){
						negociacao = item.getString("UTF8");
						
					}else if (item.getFieldName().equals("modeloNegocio")){
						modeloNegocioId = item.getString("UTF8");						
					}else if (item.getFieldName().equals("clienteNegocio")){
						cliente = item.getString("UTF8");
					}else if (item.getFieldName().equals("negociadorNegocio")){
						negociador = item.getString("UTF8");
					}else if (item.getFieldName().equals("idUsuario")){
						idUsuario = item.getString("UTF8");
					}else if (item.getFieldName().equals("idUsuarioContraparte")){
						idUsuarioContraparte = item.getString("UTF8");
					}else if(item.getFieldName().equals("urlLogoNegociador")){
						
						if(!item.getString("UTF8").equals("")){
							caminhoLogoNegociador = item.getString("UTF8");
						}
						
					}else if(item.getFieldName().equals("urlLogoCliente")){
						
						if(!item.getString("UTF8").equals("")){
							caminhoLogoCliente = item.getString("UTF8");
						}
						
					}
					
				} else if(!item.getName().equals("")){ //FIXME: _Não entra mais aqui, só quando o upload é sem ajax.
					
					/*
					if(item.getFieldName().equals("minhaLogo")){ //minhaLogo
											
						caminhoLogoNegociador = item.getName();
			
						
					}else{
						//Set destinatioDir
						caminhoLogoCliente = item.getName();
						
					}
						//File Name = "+item.getName()+
						// Content type = "+item.getContentType()+
						// File Size = "+item.getSize());
					
					
					
					File file = new File(destinationDir,item.getName());
					item.write(file);
					 */
			}
				
			}
		}catch(FileUploadException ex) {
			ex.printStackTrace();//log("Error encountered while parsing the request",ex);
		} catch(Exception ex) {
			ex.printStackTrace();//log("Error encountered while uploading file",ex);
		}
 
		/*
		 * Monta o NegociacaoBean
		 */
		
	
		
		NegociacaoBean neg = new NegociacaoBean();
		neg.setCliente(cliente);
		neg.setDataCadastro(dataCadastro);
		neg.setNegociador(negociador);
		neg.setNegociacao(negociacao);
		neg.setIdUsuario(Integer.parseInt(idUsuario));
		neg.setPasso(2);
		neg.setIdUsuarioContraparte(Integer.parseInt(idUsuarioContraparte));
		neg.setIdModeloNegociacao(5);
		int idNegocio;
		
		idNegocio = nm.cadastraNegociacao(neg);
		neg.setIdNegociacao(idNegocio);
		
		
		//Movendo arquivos
		FileInputStream fis = null;
		FileOutputStream fos = null;
		File clienteFile = null;
		File negociadorFile = null;
		//Checks para tirar a obrigatoriedade do campo de arquivo.
		if(caminhoLogoNegociador!=null && caminhoLogoCliente !=null){
			
			String caminhoFinalLogoCliente = neg.getIdNegociacao()+"_"+caminhoLogoCliente;
			String caminhoFinalLogoNegociador = neg.getIdNegociacao()+"_"+caminhoLogoNegociador;
			
			
			LogomarcaModel.cadastraLogomarcasPorNegociacao(neg, new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index()),new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index()));
			
			clienteFile = new File(tmpDir,caminhoLogoCliente);

			fis = new FileInputStream(clienteFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoCliente));
			IOUtils.copy(fis, fos);
			
			negociadorFile = new File(tmpDir,caminhoLogoNegociador);
			fis = new FileInputStream(negociadorFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoNegociador));
			IOUtils.copy(fis, fos);
			
			clienteFile.delete();
			negociadorFile.delete();
			
			
		}else if(caminhoLogoNegociador!=null) {
			
			String caminhoFinalLogoNegociador = neg.getIdNegociacao()+"_"+caminhoLogoNegociador;
			
			LogomarcaModel.cadastraLogomarca(new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index(),neg.getIdNegociacao()));
						
			negociadorFile = new File(tmpDir,caminhoLogoNegociador);
			
			fis = new FileInputStream(negociadorFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoNegociador));
			IOUtils.copy(fis, fos);
			
			negociadorFile.delete();
			
		}else if(caminhoLogoCliente !=null){
			String caminhoFinalLogoCliente = neg.getIdNegociacao()+"_"+caminhoLogoCliente;
			
			LogomarcaModel.cadastraLogomarca(new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index(),neg.getIdNegociacao()));
			
			clienteFile = new File(tmpDir,caminhoLogoCliente);
			fis = new FileInputStream(clienteFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoCliente));
			IOUtils.copy(fis, fos);
			
			clienteFile.delete();
			
		}
	
		/*
		ModeloNegociacaoBean mnb = new ModeloNegociacaoBean(idioma);
		ModeloNegociacaoModel mnm = new ModeloNegociacaoModel();
		
		mnb.setId(Integer.parseInt( modeloNegocioId ));
		mnb = mnm.getRegistro(mnb);
		mnb.instanciarNegociacao(neg);
		*/
		
		if (idNegocio > 0){
			NegociacaoBean nb = nm.getNegociacao(idNegocio);
			synchronized(session){
				session.setAttribute("NegociacaoBean", nb);
			}
			response.sendRedirect(General.APP_PATH + "interno/negociacao/listar");
		}
		else{
			throw new ServletException();
		}
	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws IOException, ServletException {
		Idioma idioma = (Idioma) request.getAttribute("idioma");
		HttpSession session = request.getSession(false);
		synchronized(session){
			session.removeAttribute("NegociacaoBean");
		}
		
		UsuarioBean ub = (UsuarioBean) session.getAttribute("usuarioBean");
		
		NegociacaoContext negociacaoContext = new NegociacaoContext();
		negociacaoContext.setUsuarioBean(ub,idioma);
		negociacaoContext.setAction("cadastrar");		
		
		Context context = createContext(request, response);
		fillContext(context, request);
		
		setContentType(request, response);
		
		context.put("pageContext", new PageContext(request));
		context.put("negociacaoContext", negociacaoContext);
		
		Template template = getTemplate(General.TEMPLATE_PREPARACAO_PATH + "cadastraNegocio.vm");
		mergeTemplate(template, context, response);
		
	}
}
